// 客户端

#include <iostream>
using namespace std;

#include <WinSock2.h> //windows 下使用套接字需要包含
#include <WS2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

int main(void)
{
	cout << "客户端程序开始运行" << endl;
	//在Windows中使用套接字需要先加载套接字库（套接字环境），最后需要释放套接字资源。
	WSADATA wsaData;
	int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (result != 0)
	{
		cout << "WSAStartup failed: " << result << endl;
		return 1;
	}

	// 1、创建通信的套接字
	// AF_INET 地址簇协议 使用IPV4
	// SOCK_STREAM 使用流式协议，即TCP  SOCK_DGRAM 使用报文协议，即UDP
	// IPPROTO_TCP, 使用指定的流式协议中的tcp协议 IPPROTO_UDP, 使用指定的报式协议中的udp协议
	SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (fd == -1)
	{
		cout << "套接字创建失败" << fd << endl;
		return -1;
	}

	// 2、连接服务器IP 端口	
	sockaddr_in saddr;
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(9999);//服务器的端口
	//填入对应服务器的IP地址，我这里是自己和自己通信所以填入自己的IP地址
	//windows下cmd ipconfig查看
	inet_pton(AF_INET, "10.53.10.28", &saddr.sin_addr.s_addr);//将ip地址转为大端，由主机序转为网络序
	
	int result_connect = connect(fd, (sockaddr*)&saddr, sizeof(saddr));
	if (result_connect == -1)
	{
		cout << "连接失败 " << result_connect << endl;
		return -1;
	}



	// 3、通信
	char receiveBuffer[1024];
	int receiveLength = 0;
	char sendBuffer[1024];
	int sendLength = 0;
	int number = 0;
	while (1)
	{
		number++;

		// 发送数据
		sendLength = sprintf_s(sendBuffer, "你好，hello world  %d", number);// 返回的不包括最后的'\0'
		send(fd, sendBuffer, sendLength + 1, 0);

		// 接收数据
		receiveLength = recv(fd, receiveBuffer, sizeof(receiveBuffer), 0);
		if (receiveLength > 0)
		{
			cout << "接收到数据： " << receiveBuffer << endl;
		}
		else if (receiveLength == 0)
		{
			cout << "服务器断开了连接" << endl;
			break;
		}
		else
		{
			cout << "出现错误" << endl;
			break;
		}
		Sleep(2000);
	}

	// 关闭描述符

	closesocket(fd);

	WSACleanup();//windows下需要清理

	cout << "客户端程序停止运行" << endl;
	system("pause");
	return 0;
}